<?php
/**
 * hognyi @taoding 2018.11.19
 *
 *
 */
namespace App\Logic;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Resources\Agent as AgentResource;
use App\Models\Order;
use PhpParser\Node\Stmt\TryCatch;
use Carbon\Carbon;

class OrderLogic
{
	
	/**
	 * 表单数据
	 * @var array
	 */
	private $_post_data = array();
	
		
	public function __construct()
	{
		
	}
	
	public function orderStep($request)
	{
		$this->_post_data = $request;
		try {
			DB::beginTransaction();
			//第1步 执行下单
			$order_info = $this->_createOrderStep1();
			return $order_info;
		} catch (\Exception $e) {
			DB::rollBack();
			return ['error' => $e->getMessage()];
		}
		
	}
	
	private function _createOrderStep1()
	{
		//订单数据
		$order_insert = array();
		$order_insert['order_id'] = $this->create_table_id();
		$order_insert['order_code'] = $this->makePaySn(\Auth::user()->id); //订单编号
		$order_insert['recharge_amount'] = $this->_post_data['amount']; //充值金额	
		$order_insert['recharge_number'] = 220;//金币数量
		$order_insert['recharge_account'] = \Auth::user()->name; //充值账户
		$order_insert['payment_method'] = Order::getPayWayMap()[$this->_post_data['payway']];//支付方式
		
		//银行卡支付
		if($this->_post_data['amount']==Order::PAY_WAY_BANK){
			$order_insert['recharge_account'] = 0 ;//充值账户
			$order_insert['bank_id'] = 1 ;// 银行ID
			//$order_insert['bank_account_number'] = 1 ;//银行账户
		}
		
		$order_insert['state'] = 0 ; // 订单状态
		$order_insert['order_time'] =  Carbon::now()->toDateTimeString(); //下单时间
		$order_insert['invalid_time'] = Carbon::parse('+3 days')->toDateTimeString(); //过期时间
		//dd($order_insert['invalid_time']);
		$order_insert['create_by'] = \Auth::user()->name;  //创建用户
		$order_insert['create_date'] = Carbon::now()->toDateTimeString(); //创建时间
		$order_insert['remark'] = 'remark'; //备注
		$order_insert['del_flag'] = 0;
		//print_r($order_insert);exit;
		
		try{
			// 执行插入
			$order_model = Order::create($order_insert);	
			DB::commit();
			//dd($order_model);
			if (!$order_model->order_code) {
			    flash('订单保存失败[未生成支付单]')->error()->important();
			}
			else{
			    
			   return $order_model->toArray();
			}			
			
			
		}
		catch(\Exception $e){
			echo $e->getMessage();
		}
		

	}
	
	/**
	 * 生成支付单编号(两位随机 + 从2000-01-01 00:00:00 到现在的秒数+微秒+会员ID%1000)，该值会传给第三方支付接口
	 * 长度 =2位 + 10位 + 3位 + 3位  = 18位
	 * 1000个会员同一微秒提订单，重复机率为1/100
	 * @return string
	 */
	public function makePaySn($member_id)
	{
		return mt_rand(10, 99)
		. sprintf('%010d', time() - 946656000)
		. sprintf('%03d', (float)microtime() * 1000)
		. sprintf('%03d', (int)$member_id % 1000);
	}
	
	/**
	 * 订单编号生成规则
	 * 生成订单编号(年取1位 + $pay_id取13位 + 第N个子订单取2位)
	 * 1000个会员同一微秒提订单，重复机率为1/100
	 * @param $pay_sn
	 * @return string
	 */
	public function makeOrderSn($pay_sn)
	{
		//记录生成子订单的个数，如果生成多个子订单，该值会累加
		static $num;
		if (empty($num)) {
			$num = 1;
		} else {
			$num++;
		}
		return (date('y', time()) % 9 + 1) . sprintf('%013d', $pay_sn) . sprintf('%02d', $num);
	}
	
	
	// 支付第一步
	public function pay_step1($attributes, $openid)
	{
		$time = time();
		$app = Factory::payment(config('wechat.payment.default'));
		$result = $app->order->unify([
				'body' => '小T商城',
				'detail' => '小T商城的订单',
				'out_trade_no' => $attributes['order_sn'],
				'total_fee' => $attributes['actual_price'] * 100,
				'trade_type' => 'JSAPI',
				'openid' => $openid,
		]);
		$this->pay_log('order:' . var_export($attributes, true) . '  result:' . var_export($result, true));
		if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
			// 如果成功生成统一下单的订单，那么进行二次签名 二次签名的参数必须与下面相同
			$params = [
					'appId' => config('wechat.payment.default.app_id'),
					'timeStamp' => time(),
					'nonceStr' => $result['nonce_str'],
					'package' => 'prepay_id=' . $result['prepay_id'],
					'signType' => 'MD5',
			];
			$params['paySign'] = generate_sign($params, config('wechat.payment.default.key'));
			return $params;
		} else {
			// 返回错误信息
			$this->pay_log('json_prepare' . var_export($result, true));
			return false;
		}
	}
	
	
	public function create_table_id(){
		
		return md5(mt_rand(100000,999999));
	}
	
	/**
	 * 记录日志
	 */
	private function pay_log($msg)
	{
		$msg = date('H:i:s') . "|" . $msg . "\r\n";
		$msg .= '| GET:' . var_export($_GET, true) . "\r\n";
		file_put_contents('./storage/logs/pay' . date('Y-m-d') . ".log", $msg, FILE_APPEND);
	}
}